package com.first.config.redis;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

@Configuration  
@EnableConfigurationProperties(JedisProperties.class)//开启属性注入,通过@autowired注入 
public class JedisAutoConfig {

//	  @Autowired   方式一
//	   private JedisProperties prop;
//	  @Bean(name="jedisPool")  
//	    public JedisPool jedisPool() {  
//	        JedisPoolConfig config = new JedisPoolConfig();  
////	        config.setMaxTotal(prop.getMaxTotal());  
//	        config.setMaxIdle(prop.getMaxIdle());  
//	        config.setMaxWaitMillis(prop.getMaxWait());  
////	        config.setTestOnReturn(prop.get);
//	        return new JedisPool(config, prop.getHostName(),prop.getPort());  
//	    }  
//	  
	  
	
//	 方式二
	   @Bean(name= "jedisPool")  
	    @Autowired  
	    public JedisPool jedisPool(@Qualifier("jedis.pool.config") JedisPoolConfig config,   
	                @Value("${spring.redis.hostName}")String host,   
	                @Value("${spring.redis.port}")int port,
	                @Value("${spring.redis.timeout}")int timeout) {  
	        return new JedisPool(config, host, port,timeout);  
	    }  
	      
	    @Bean(name= "jedis.pool.config")  
	    public JedisPoolConfig jedisPoolConfig (@Value("${spring.redis.pool.maxActive}")int maxActive,  
	                                @Value("${spring.redis.pool.maxIdle}")int maxIdle,  
	                                @Value("${spring.redis.pool.maxWait}")int maxWait) {  
	        JedisPoolConfig config = new JedisPoolConfig();
	      //连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true
	        config.setBlockWhenExhausted(true);
	      //设置的逐出策略类名, 默认DefaultEvictionPolicy(当连接超过最大空闲时间,或连接数超过最大空闲连接数)
//	        config.setEvictionPolicyClassName("org.apache.commons.pool2.impl.DefaultEvictionPolicy");
	      //是否启用pool的jmx管理功能, 默认true
	        config.setJmxEnabled(true);
	      //是否启用后进先出, 默认true
	        config.setLifo(true);
	      //最大空闲连接数, 默认8个
	       config.setMaxIdle(maxIdle);
	     //最大连接数, 默认8个
	       config.setMaxTotal(maxActive);
	     //获取连接时的最大等待毫秒数(如果设置为阻塞时BlockWhenExhausted),如果超时就抛异常, 小于零:阻塞不确定的时间,  默认-1
	       config.setMaxWaitMillis(maxWait); 
	     //逐出连接的最小空闲时间 默认1800000毫秒(30分钟) 
	    // 表示一个对象至少停留在idle状态的最短时间，然后才能被idle object evitor扫描并驱逐；这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义；
//	       config.setMinEvictableIdleTimeMillis(1800000);
	     //最小空闲连接数, 默认0
	       config.setMinIdle(0);
	     //对象空闲多久后逐出, 当空闲时间>该值 且 空闲连接>最大空闲数 时直接逐出,不再根据MinEvictableIdleTimeMillis判断  (默认逐出策略)   
//	       config.setSoftMinEvictableIdleTimeMillis(1800000);
	     //在获取连接的时候检查有效性, 默认false
	    //在borrow一个jedis实例时，是否提前进行alidate操作；如果为true，则得到的jedis实例均是可用的；
//	       config.setTestOnBorrow(true);
	    //在return给pool时，是否提前进行validate操作；
//	       config.setTestOnReturn(true);
	     //逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1 
	     //表示idle object evitor两次扫描之间要sleep的毫秒数；
//	       config.setTimeBetweenEvictionRunsMillis(-1);
	     //在空闲时检查有效性, 默认false 
		 //如果为true，表示有一个idle object evitor线程对idle object进行扫描，如果validate失败，此object会被从pool中drop掉；这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义；
//		  config.setTestWhileIdle(false);
	      //每次逐出检查时 逐出的最大数目 如果为负数就是 : 1/abs(n), 默认3
//	       config.setNumTestsPerEvictionRun(3);
	        return config;  
	    }  
}
